﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CMD_DKT.DAL;
using System.Collections;
using System.Data.SqlClient;
using System.Web;
using Newtonsoft.Json;
using CMD.BAL.MISC;
using RestSharp;

namespace CMD_DKT.BAL
{
    public class Solicitud
    {
        #region Propiedades

        private Dictionary<string, string> sapsap_msj;
        public Dictionary<string, string> Sapsap_msj
        {
            get { return sapsap_msj; }
            set { sapsap_msj = value; }
        }

        public Dictionary<string, string> parametros;

        private bool modificacion=false;
        public bool Modificacion
        {
            get { return modificacion; }
            set { modificacion = value; }
        }
        
        public DataSet dsSolicitud;

        private Dictionary<string, string> sapsap;
        public Dictionary<string, string> Sapsap
        {
            get { return sapsap; }
            set { sapsap = value; }
        }
        //----------------------------- CONTADORES
        int contTodas;
        public int ContTodas
        {
            get { return contTodas; }
            set { contTodas = value; }
        }

        int contAltas;
        public int ContAltas
        {
            get { return contAltas; }
            set { contAltas = value; }
        }

        int contModificaciones;
        public int ContModificaciones
        {
            get { return contModificaciones; }
            set { contModificaciones = value; }
        }

        int contReemplazos;
        public int ContReemplazos
        {
            get { return contReemplazos; }
            set { contReemplazos = value; }
        }

        int contEnProceso;
        public int ContEnProceso
        {
            get { return contEnProceso; }
            set { contEnProceso = value; }
        }

        int contAprobadas;
        public int ContAprobadas
        {
            get { return contAprobadas; }
            set { contAprobadas = value; }
        }

        int contBorradores;
        public int ContBorradores
        {
            get { return contBorradores; }
            set { contBorradores = value; }
        }

        int contEnviando;
        public int ContEnviando
        {
            get { return contEnviando; }
            set { contEnviando = value; }
        }

        int contCancelada;
        public int ContCancelada
        {
            get { return contCancelada; }
            set { contCancelada = value; }
        }

        int contRechazada;
        public int ContRechazada
        {
            get { return contRechazada; }
            set { contRechazada = value; }
        }

        int contRDMaestros;
        public int ContRDMaestros
        {
            get { return contRDMaestros; }
            set { contRDMaestros = value; }
        }

        int contRCreditoC;
        public int ContRCreditoC
        {
            get { return contRCreditoC; }
            set { contRCreditoC = value; }
        }

        int contRDistribucion;
        public int ContRDistribucion
        {
            get { return contRDistribucion; }
            set { contRDistribucion = value; }
        }

        int contRCRetailD;
        public int ContRCRetailD
        {
            get { return contRCRetailD; }
            set { contRCRetailD = value; }
        }

        int contRDAProveedores;
        public int ContRDAProveedores
        {
            get { return contRDAProveedores; }
            set { contRDAProveedores = value; }
        }

        //---------------------------- UNIDs
        long unid_solicitud;

        public long Unid_solicitud
        {
            get { return unid_solicitud; }
            set { unid_solicitud = value; }
        }
        long unid_docinfo;

        public long Unid_docinfo
        {
            get { return unid_docinfo; }
            set { unid_docinfo = value; }
        }
        long unid_datos;

        public long Unid_datos
        {
            get { return unid_datos; }
            set { unid_datos = value; }
        }
        long unid_datosgral;

        public long Unid_datosgral
        {
            get { return unid_datosgral; }
            set { unid_datosgral = value; }
        }
        long unid_dirfiscal;

        public long Unid_dirfiscal
        {
            get { return unid_dirfiscal; }
            set { unid_dirfiscal = value; }
        }
        long unid_direntrega;

        public long Unid_direntrega
        {
            get { return unid_direntrega; }
            set { unid_direntrega = value; }
        }
        long unid_rfv;

        public long Unid_rfv
        {
            get { return unid_rfv; }
            set { unid_rfv = value; }
        }
        long unid_dpv;

        public long Unid_dpv
        {
            get { return unid_dpv; }
            set { unid_dpv = value; }
        }
        long unid_infoad;

        public long Unid_infoad
        {
            get { return unid_infoad; }
            set { unid_infoad = value; }
        }
        long unid_datosbanc;

        public long Unid_datosbanc
        {
            get { return unid_datosbanc; }
            set { unid_datosbanc = value; }
        }
        long unid_interlocutores;

        public long Unid_interlocutores
        {
            get { return unid_interlocutores; }
            set { unid_interlocutores = value; }
        }
        long unid_documentos;

        public long Unid_documentos
        {
            get { return unid_documentos; }
            set { unid_documentos = value; }
        }
        long unid_wf;

        public long Unid_wf
        {
            get { return unid_wf; }
            set { unid_wf = value; }
        }
        long id_status;

        public long Id_status
        {
            get { return id_status; }
            set { id_status = value; }
        }
        long id_prioridad;

        public long Id_prioridad
        {
            get { return id_prioridad; }
            set { id_prioridad = value; }
        }
        long id_tipo;

        public long Id_tipo
        {
            get { return id_tipo; }
            set { id_tipo = value; }
        }

        string nombreCliente;
        public string NombreCliente
        {
            get { return nombreCliente; }
            set { nombreCliente = value; }
        }

        string numeroCliente;
        public string NumeroCliente
        {
            get { return numeroCliente; }
            set { numeroCliente = value; }
        }

        //------------------------------------------------

        #endregion

        public Solicitud() 
        {
            parametros = new Dictionary<string,string>();
            loadCounters();
        }


        /// <summary>
        /// Obtiene los UNIDs relacionados con el UNID de la actual Solicitud e inicializa propiedades del objeto con dichos valores
        /// </summary>
        /// <param name="id">UNID de la solicitud</param>
        public Solicitud(string id)
        {
            loadCounters();

            if (id == "" || id == null)
                return;

            dsSolicitud = new DataSet();
            string qryGetUNIDs = "Exec SP_CMD_GET_UNIDs " + id;

            try
            {
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryGetUNIDs));

                unid_solicitud = long.Parse(id);
                unid_docinfo = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DOCINFO"].ToString());
                unid_datos = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOS"].ToString());
                unid_datosgral = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOSGRAL"].ToString());
                unid_datosbanc = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOSBANC"].ToString());
                unid_dirfiscal = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DIRFISCAL"].ToString());
                unid_direntrega = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DIRENTREGA"].ToString());
                unid_rfv = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_RFV"].ToString());
                unid_dpv = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DPV"].ToString());
                unid_infoad = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_INFOAD"].ToString());
                unid_interlocutores = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_INTERLOCUTORES"].ToString());
                unid_documentos = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DOCUMENTOS"].ToString());
                //TODO: AJUSTE cambia UNID_SOLICITUD_WF a UNID_ROL
                //unid_wf = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_WF"].ToString());
                id_status = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_SOLICITUD_STATUS"].ToString());
                id_prioridad = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_PRIORIDAD"].ToString());
                id_tipo = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_TIPO_SOLICITUD"].ToString());
                nombreCliente = dsSolicitud.Tables[0].Rows[0]["NOMBRE_CLIENTE"].ToString();
                numeroCliente = dsSolicitud.Tables[0].Rows[0]["NUMERO_CLIENTE"].ToString();

                GetSolicitud();

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end constructor

        /// <summary>
        /// Actualiza/Inserta. 
        /// </summary>
        /// <param name="param">Diccionario que contiene el nombre y valor de los parámetros que necesita el SP.</param>
        public DataSet UpsertData()
        {
            //string mensaje = "";
            //parametros = new Dictionary<string, string>();

            DataSet result = new DataSet();
            SqlCommand sp = new SqlCommand("SP_CMD_UPSERT_SOL");
            sp.CommandType = CommandType.StoredProcedure;

            try
            {
                foreach (KeyValuePair<string, string> p in parametros)
                {
                    sp.Parameters.AddWithValue(p.Key, p.Value);
                }//foreach

                result = SrvDB.ExecuteCommand(sp);

                
                if (result.Tables.Count == 1)
                {
                    for (int i = 0; i < result.Tables[0].Rows.Count; i++)
                    {                     
                            //@doctos_unidDoctos as doctos_unidDoctos,        
                            //@sol_idSolStat as sol_idSolStat ,        
                            //@sol_idPrio as ,        
                            //@sol_idTipoSol   as      
                            //,@sol_numSol   as       
                            //,@sol_nomCte   as  
                        long parsed;
                        int parsedI;
                        if (long.TryParse(result.Tables[0].Rows[i]["unidSolicitud"].ToString(), out parsed))
                            this.Unid_solicitud = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["docInfo_unidDocInfo"].ToString(), out parsed))
                            this.Unid_docinfo = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["datsol_unidSolicitudDatos"].ToString(), out parsed))
                            this.Unid_datos = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["datgral_unidSolicitud"].ToString(), out parsed))
                            this.Unid_datosgral = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["dirFis_unidDirFiscal"].ToString(), out parsed))
                            this.Unid_dirfiscal = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["dirEnt_unidDirEntrega"].ToString(), out parsed))
                            this.Unid_direntrega = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["datRFV_unidRFV"].ToString(), out parsed))
                            this.Unid_rfv = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["datDPV_unidDPV"].ToString(), out parsed))
                            this.Unid_dpv = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["infoad_unidInfoad"].ToString(), out parsed))
                            this.Unid_infoad = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["datBnc_unidBanc"].ToString(), out parsed))
                            this.Unid_datosbanc = parsed;
                        if (long.TryParse(result.Tables[0].Rows[i]["doctos_unidDoctos"].ToString(), out parsed))
                            this.Unid_documentos = parsed;
                        if (int.TryParse(result.Tables[0].Rows[i]["sol_idSolStat"].ToString(), out parsedI))
                            this.Id_status = parsedI;
                        if (int.TryParse(result.Tables[0].Rows[i]["sol_idPrio"].ToString(), out parsedI))
                            this.Id_prioridad = parsedI;
                        if (int.TryParse(result.Tables[0].Rows[i]["sol_idTipoSol"].ToString(), out parsedI))
                            this.Id_tipo = parsedI;
                    }// renglones
                    
                    if (this.Modificacion)
                    {
                        this.Sapsap.Add("UNID_SOLICITUD", this.Unid_solicitud.ToString());
                        InsertSapLocal newSap = new InsertSapLocal();
                        newSap.InsertSap(this.Sapsap);

                        this.Sapsap_msj.Add("UNID_SOLICITUD", this.Unid_solicitud.ToString());
                        newSap = new InsertSapLocal();
                        newSap.InsertSap_Message(this.Sapsap_msj);
                    }
                }//

                //if(result.Tables.Count == 2)
                //    mensaje = result.Tables[0].Rows[0][0].ToString()+ ": "+result.Tables[1].Rows[0][0].ToString();
                //if (result.Tables.Count == 3)
                //    mensaje = result.Tables[1].Rows[0][0].ToString() + "\n " + result.Tables[0].Rows[0][0].ToString() + "\n " + result.Tables[2].Rows[0][0].ToString();
                //if (result.Tables.Count == 0)
                //    mensaje = "Se ha realizado la actualización.";
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return result;
            //return mensaje;
        }

        
        /// <summary>
        /// Obtiene los registros de las Solicitudes en base su Status y Tipo
        /// </summary>
        /// <param name="todas">Determina si se seleccionan todas las solicitudes</param>
        /// <param name="idStatus">Id del status (filtro)</param>
        /// <param name="idTipo">Id del Tipo de Solicitud (filtro)</param>
        /// <returns></returns>
        public  DataTable GetData(bool todas,int idStatus, int idTipo, long unidRol)
        {
            DataTable solicitudes = new DataTable();
            string query = "Exec SP_CMD_SEL_SOL";

            if (unidRol > 0)
            {
                query = query + " 0,3,0," + unidRol.ToString();
            }
            else
            {
                if (todas)
                    query = query + " 1,0,0";
                else
                {
                    query = query + " 0," + idStatus.ToString() + "," + idTipo.ToString();
                }
            }

            try
            {
                solicitudes = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return solicitudes;
        }// end GetData
        /// <summary>
        /// Obtiene los registros de las Solicitudes en base su Status y Tipo
        /// </summary>
        /// <param name="todas">Determina si se seleccionan todas las solicitudes</param>
        /// <param name="idStatus">Id del status (filtro)</param>
        /// <param name="idTipo">Id del Tipo de Solicitud (filtro)</param>
        /// <param name="unidRol">Id del rol</param>
        /// <param name="order_by">Numero de la columna a ordenar, nada ordenamiento normal</param>
        /// <param name="asc">1 ascendente 0 descendente, nada ascendente</param>
        /// <returns>regresa el datatable de las solicitudes segun criterio</returns>
        public DataTable GetData(int todas, int idStatus, int idTipo, long unidRol,int order_by, int asc)
        {
            DataTable solicitudes = new DataTable();
            string query = "Exec SP_CMD_SEL_SOL";

            if (unidRol > 0)
            {
                query = query + " @SolTodas = 0, "+
                                " @SolStatus = 3, " +
                                " @SolTipo = 0," + 
                                " @SolRol = " + unidRol.ToString();
            }
            else
            {
                if (todas==1)
                    query = query + " @SolTodas = 1, " +
                                " @SolStatus = 0, " +
                                " @SolTipo = 0 ";
                else
                {
                    query = query + " 0," + idStatus.ToString() + "," + idTipo.ToString();
                }
            }
            query += ",@SolOrderby  = " + order_by.ToString() +
                     ",@SolOrderAsc  = " + asc.ToString();

            try
            {
                solicitudes = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return solicitudes;
        }// end GetData

        /// <summary>
        /// Elimina los registros cuyo Id recibe como parámetro de la tabla de Solicitudes
        /// </summary>
        /// <param name="ids">Cadena de Ids separados por coma</param>
        public static void DeleteData(string ids)
        {
            int rowsAffected = 0;
            string query = "Exec SP_CMD_DELETE_SOL '" + ids + "'";

            try
            {
                rowsAffected = SrvDB.ExecuteNonQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end DeleteData

        /// <summary>
        /// Actualiza las solicitudes rechazadas a sincronizacion disponible
        /// </summary>
        /// <param name="ids"></param>
        public static void UpdateRechSols(string unid_sol)
        {
            int rowsAffected = 0;
            string query = "Exec SP_CMD_UPDATE_DOCS_RECHAZO " + unid_sol ;

            try
            {
                rowsAffected = SrvDB.ExecuteNonQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end DeleteData

        public static DataTable GetStatus(string unid)
        {
            string query = "Exec SP_CMD_GET_STATUS "+ unid;

            try
            {
                DataTable DT= SrvDB.ExecuteQuery(query);
                return DT;
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }

        }//end DeleteData

        /// <summary>
        /// Asigna los contadores de solicitudes por tipo y status
        /// </summary>
        public void loadCounters()
        {
            DataSet contadores = new DataSet();
            
            string qryStatus = "Exec SP_CMD_SOL_COUNT_STATUS";
            string qryTipo = "Exec SP_CMD_SOL_COUNT_TIPO";
            string qryRol = "Exec SP_CMD_SOL_COUNT_ROL";

            try
            {
                contadores.Tables.Add(GetData(true, 0, 0,0));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryStatus));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryTipo));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryRol));

                ContTodas = contadores.Tables[0].Rows.Count;

                this.ContAltas = int.Parse(contadores.Tables[2].Rows[0]["Cont"].ToString());
                this.ContModificaciones = int.Parse(contadores.Tables[2].Rows[1]["Cont"].ToString());
                this.ContReemplazos = int.Parse(contadores.Tables[2].Rows[2]["Cont"].ToString());

                this.ContAprobadas = int.Parse(contadores.Tables[1].Rows[3]["Cont"].ToString());
                this.ContBorradores = int.Parse(contadores.Tables[1].Rows[0]["Cont"].ToString());
                this.ContEnviando = int.Parse(contadores.Tables[1].Rows[1]["Cont"].ToString());
                this.ContEnProceso = int.Parse(contadores.Tables[1].Rows[2]["Cont"].ToString());
                this.ContRechazada = int.Parse(contadores.Tables[1].Rows[5]["Cont"].ToString());
                this.ContCancelada = int.Parse(contadores.Tables[1].Rows[4]["Cont"].ToString());

                this.ContRDMaestros = int.Parse(contadores.Tables[3].Rows[0]["Cont"].ToString());
                this.ContRCreditoC = int.Parse(contadores.Tables[3].Rows[1]["Cont"].ToString());
                this.ContRDistribucion = int.Parse(contadores.Tables[3].Rows[2]["Cont"].ToString());
                this.ContRCRetailD = int.Parse(contadores.Tables[3].Rows[3]["Cont"].ToString());
                this.ContRDAProveedores = int.Parse(contadores.Tables[3].Rows[4]["Cont"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }


        }// end loadCounters

        /// <summary>
        /// Obtiene los datos de la Solicitud actual
        /// </summary>
        private void GetSolicitud()
        {
            string qryDatos = "Exec SP_CMD_GET_SOL_DATOS "+ unid_datos;
            string qryDatosgral = "Exec SP_CMD_GET_SOL_DATOSGRAL " + unid_datosgral;
            string qryDatosbanc = "Exec SP_CMD_GET_SOL_DATOSBANC " + unid_datosbanc;
            string qryDirentrega = "Exec SP_CMD_GET_SOL_DIRENTREGA " + unid_direntrega;
            string qryDirfiscal = "Exec SP_CMD_GET_SOL_DIRFISCAL " + unid_dirfiscal;
            string qryDocInfo = "Exec SP_CMD_GET_DOCINFO " + unid_docinfo;
            string qryDocumentos = "Exec SP_CMD_GET_SOL_DOCUMENTOS " + unid_documentos;
            string qryInfoad = "exec SP_CMD_GET_SOL_INFOAD " + unid_infoad;
            string qryInterlocutores = "exec SP_CMD_GET_SOL_INTERLOCUTORES " + unid_interlocutores;
            string qryPrioridad = "exec SP_CMD_GET_SOL_PRIORIDAD " + id_prioridad;
            string qryRfv = "exec SP_CMD_GET_SOL_RFV " + unid_rfv;
            string qryStatus = "exec SP_CMD_GET_SOL_STATUS "+ id_status;
            string qryTipo = "exec SP_CMD_GET_SOL_TIPO " + id_tipo;
            string qryWf = "exec SP_CMD_GET_SOL_WF " + unid_wf;
            string qryDpv = "exec SP_CMD_GET_SOL_DPV " + unid_dpv;
            
            try
            {
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatos)); //table 2
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatosgral)); //table 3
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatosbanc)); //table 4
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDirentrega)); //table 5
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDirfiscal)); //table 6
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDocumentos)); //table 7
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryInterlocutores)); //table 8
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryPrioridad)); //table 9
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryRfv)); //table 10
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryStatus)); //table 11
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryTipo)); //table 12
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryWf)); //table 13
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryInfoad)); //table 14
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDpv)); //table 15

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end GetSolicitud

        /// <summary>
        /// Agrega elementos al Diccionario de parámetros para el Upsert
        /// </summary>
        /// <param name="key">Nombre de la Key que se agregará al Diccionario de parámetros</param>
        /// <param name="value">Valor de la Key que se agregará al Diccionario de parámetros</param>
        public void SetDictionaryParameterValues(string key, string value)
        {
            parametros.Add(key, value);
        }

        public static DataTable GetSolToSyncFiles()
        {
            string qry = "SP_CMD_GET_SOL_SEND";
            DataTable solEnviadas = new DataTable();

            try
            {
                solEnviadas = SrvDB.ExecuteQuery(qry);

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return solEnviadas;
        }//end SyncSolFiles

        public static DataTable GetDataToInsertSolDoc(long unidSolicitud)
        {
            string query = "SP_GET_DATAtoINSERT_SOLDOCS " + unidSolicitud.ToString();
            DataTable dt = new DataTable();

            try
            {
                dt = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;
        }

        public static int SetDocUploadedFlag( string unidSolDoc)
        {
            string qry = "SP_CMD_UPDATE_SOL_DOC " + unidSolDoc;
            int res = 0;

            try
            {
                res = SrvDB.ExecuteNonQuery(qry);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return res;

        }// end SetDocUploadedFlag

        public static long InsertInServer_SolDocs(long unid, string doc, string msg)
        {
            long unid_doc = 0;
            SqlCommand sp = new SqlCommand("SP_CMD_INSERT_LOG_DOC");
            sp.CommandType = CommandType.StoredProcedure;

            sp.Parameters.AddWithValue("UnidDoc", unid_doc);
            sp.Parameters.AddWithValue("Doc", doc);
            sp.Parameters.AddWithValue("Msg", msg);

            try
            {
                bool done = long.TryParse( SrvDB.ExecuteCommand(sp).Tables[0].Rows[0][0].ToString(), out unid_doc);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return unid_doc;
        }// end InsertInServer_SolDocs

        public static DataTable GetSolUploadedDocs()
        {
            string query = "SP_CMD_GET_SOL_DOC_UPLOADED";
            DataTable dtUploadedFiles = new DataTable();

            try
            {
                dtUploadedFiles = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dtUploadedFiles;
        }//end GetSolUploadedDocs

        public static DataTable GetSolAllData(long unidSol)
        {
            string query = "SP_CMD_GET_SOL_ALLDATA " + unidSol;
            DataTable dtAllData = new DataTable();

            try
            {
                dtAllData = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dtAllData;
        }// GetSolAllData

        public static int SetDocSyncFlag(long unid)
        {
            string qry = "SP_CMD_UPDATE_SOL_SYNC "+ unid.ToString();
            int i = 0;
            try
            {
                i= SrvDB.ExecuteNonQuery(qry);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
            return i;
        }// end SetDocSyncFlag

        /// <summary>
        /// Serialize Dictionary
        /// </summary>
        /// <param name="parametros">Dictionary with parameters to WCF Web Service</param>
        /// <returns>parameters Serialized</returns>
        public static string SerializeParamWCFService( Dictionary<string, string> parametros)
        {
            try
            {
                string json = JsonConvert.SerializeObject(parametros); //JSON.Serialize(parametros);
                //JavaScriptSerializer ms2 = new JavaScriptSerializer();
                //string json2 = ms2.Serialize(parametros);
                return json;
            }
            catch (Exception ex)
            {

                throw ex;
            }

            
        }// end SerializeParamWCFService

        public static string SerializeParamWCFService(Dictionary<string, Dictionary<string, string>> parametros)
        {
            try
            {
                string json = JsonConvert.SerializeObject(parametros); //JSON.Serialize(parametros);
                //JavaScriptSerializer ms2 = new JavaScriptSerializer();
                //string json2 = ms2.Serialize(parametros);
                return json;
            }
            catch (Exception ex)
            {

                throw ex;
            }


        }// end Seri

        /// <summary>
        /// Deserialize WCF Service response
        /// </summary>
        /// <param name="content">Response to Deserialize</param>
        /// <returns>Dictionary with response values</returns>
        public static Dictionary<string, string> DeserializeResponseWCFServide(string content)
        {
            Dictionary<string, string> res = new Dictionary<string, string>();
            res = (Dictionary<string, string>)JsonConvert.DeserializeObject(content, typeof(Dictionary<string, string>));

            return res;
        }

        public bool InsertNewRol(long UnidSol)
        {
            DataTable dt;
            try
            {
                dt=SolicitudRol.InsertNewRol(UnidSol.ToString(), System.Configuration.ConfigurationManager.AppSettings["Unid_datosMaestros"].ToString(), "3");

                if ( dt.Rows.Count != 0)
                    return true;
                else
                    return false;
            }
            catch
            {
                return false;
            }
        }
        public bool UpdateSolStatus(long UnidSol, int IdStatus, long unidDatosMaestros)
        {
            bool result = false;
            if (UnidSol != null && IdStatus != null)
            {
                try
                {
                    string query = "SP_CMD_UPDATE_SOL_STATUS " + UnidSol.ToString() + "," + IdStatus.ToString() +","+ unidDatosMaestros.ToString();
                    int cnt= SrvDB.ExecuteNonQuery(query);

                    if (cnt > 0)
                        result = true;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            } 
            
            return result;
        }//end UpdateSolStatus

        public static Dictionary<string, string> CallWCFService(string service, string resource, object parametros)
        {
            Dictionary<string, string> res;

            try
            {
                var client = new RestClient(service);
                //client.Authenticator = new HttpBasicAuthenticator("administrator", "Passw0rd1!");//new SimpleAuthenticator("username", "win-65ate595ire\\administrator", "password", "Passw0rd1!");
                client.Authenticator = new HttpBasicAuthenticator("prueba", "Pru3b4cmd1");
                //client.Authenticator = new NtlmAuthenticator();

                //new HttpBasicAuthenticator("win-65ate595ire\\administrator", "Passw0rd1!");

                var request = new RestRequest(Method.POST);
                request.Resource = resource;
                request.RequestFormat = RestSharp.DataFormat.Json;

                request.AddHeader("Content-type", "application/json");

                request.AddBody(parametros);
                //request.AddParameter("unidSolicitud",parametros);

                IRestResponse response = client.Execute(request);

                try
                {
                    if (response.ErrorException == null)
                    {
                        res = Solicitud.DeserializeResponseWCFServide(response.Content);
                        res = (Dictionary<string, string>)JsonConvert.DeserializeObject(res[resource + "Result"], typeof(Dictionary<string, string>));
                    }

                    else
                    {
                        res = new Dictionary<string, string>();
                        res.Add("ERROR", response.ErrorException.Message);
                    }
                }
                catch (Exception ex)
                {
                    res = new Dictionary<string, string>();
                    res.Add("Exception", ex.Message);
                }

                return res;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        public static int InsertSolSyncDoc(long unidSol, long unidDoc)
        {
            string query = "SP_CMD_INSERT_SOL_SYNCDOC " + unidSol.ToString() +","+ unidDoc.ToString();
            int r = 0;

            try
            {
                r = SrvDB.ExecuteNonQuery(query);

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return r;
        }

        public static int InsertSolSyncSol(long unidSol, long unidSolRes, int statusProceso)
        {
            string query = "SP_CMD_INSERT_SOL_SYNCSOL " + unidSol.ToString()+","+unidSolRes.ToString()+","+ statusProceso.ToString();
            int r = 0;

            try
            {
                r = SrvDB.ExecuteNonQuery(query);

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return r;
        }

        public static DataTable WFGetInfoDetalle()
        {
            string query = "SP_CMD_WF_GETINFO_DETALLE";
            DataTable dt = new DataTable();

            try
            {
                dt = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;
        }

        public static DataTable GetSolProceso(int status)
        {
            string query = "SP_CMD_GET_SOL_PROCESO "+status.ToString();
            DataTable dt = new DataTable();

            try
            {
                dt = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;
        }

        public static int WFInsertDetalle(Dictionary<string,string> parametros)
        {
            int res = 0;
            SqlCommand sp = new SqlCommand("SP_CMD_WF_SETDETALLE");
            sp.CommandType = CommandType.StoredProcedure;

            try
            {
                foreach (KeyValuePair<string, string> p in parametros)
                {
                    sp.Parameters.AddWithValue(p.Key, p.Value);
                }//foreach

                DataSet ds = SrvDB.ExecuteCommand(sp);

                
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return res;
        }//

        public static string WFGetLastStatusReviewDate()
        {
            string qry = "SP_CMD_WF_GETLASTREVIEWDATE";
            string fecha;
            try
            {
                DataTable dt =SrvDB.ExecuteQuery(qry);
                fecha = dt.Rows[0]["FECHA"].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return fecha;
        
        }//
        public static string StatReviewGetLastDate()
        {
            string qry = "SP_CMD_GETLASTREVIEWDATE";
            string fecha;
            try
            {
                DataTable dt = SrvDB.ExecuteQuery(qry);
                fecha = dt.Rows[0]["FECHA"].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return fecha;

        }//

        public static string UpdateLastUpdate()
        {
            string qry = "SP_CMD_UPDATE_LASTUPDATE";
            string fecha;
            try
            {
                DataTable dt = SrvDB.ExecuteQuery(qry);
                fecha = dt.Rows[0]["FECHA"].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return fecha;

        }//

        public static DataTable GetMensajeSap(string unidSolicitud)
        {
            string qry = "SP_CMD_GET_MENSAJE_SAP @UNID_SOLICITUD="+unidSolicitud;
            DataTable dt;
            try
            {
                dt = SrvDB.ExecuteQuery(qry);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;

        }//
        public static DataTable GetSapSap(string unidSolicitud)
        {
            string qry = "SP_CMD_GET_SAP_SAP @UNID_SOLICITUD=" + unidSolicitud;
            DataTable dt;
            try
            {
                dt = SrvDB.ExecuteQuery(qry);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;

        }//

        //-----------------------------------------

        public static Dictionary<string, Dictionary<string, string>> CallWCFServiceSAP(string service, string resource, object parametros)
        {
            Dictionary<string, Dictionary<string, string>> tablas;
             Dictionary<string, string> res;

            try
            {
                var client = new RestClient(service);
                //client.Authenticator = new HttpBasicAuthenticator("administrator", "Passw0rd1!");//new SimpleAuthenticator("username", "win-65ate595ire\\administrator", "password", "Passw0rd1!");
                client.Authenticator = new HttpBasicAuthenticator("prueba", "Pru3b4cmd1");
                //client.Authenticator = new NtlmAuthenticator();

                //new HttpBasicAuthenticator("win-65ate595ire\\administrator", "Passw0rd1!");

                var request = new RestRequest(Method.POST);
                request.Resource = resource;
                request.RequestFormat = RestSharp.DataFormat.Json;

                request.AddHeader("Content-type", "application/json");

                request.AddBody(parametros);
                //request.AddParameter("unidSolicitud",parametros);

                IRestResponse response = client.Execute(request);

                try
                {
                    if (response.ErrorException == null)
                    {
                        /*
                        res = Solicitud.DeserializeResponseWCFServide(response.Content);
                        res = (Dictionary<string, string>)JsonConvert.DeserializeObject(res[resource + "Result"], typeof(Dictionary<string, string>));
                         * */
                        res = Solicitud.DeserializeResponseWCFServide(response.Content);
                        tablas = (Dictionary<string, Dictionary<string, string>>)
                            JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(res[resource + "Result"]);

                        return tablas;
                    }

                    else
                    {
                        res = new Dictionary<string, string>();
                        res.Add("ERROR", response.ErrorException.Message);
                        //return res;
                        tablas = new Dictionary<string, Dictionary<string, string>>();
                        tablas.Add("ERROR", res);
                        return tablas;
                    }
                }
                catch (Exception ex)
                {
                    res = new Dictionary<string, string>();
                    res.Add("Exception", ex.Message);
                    //return res;
                    tablas = new Dictionary<string, Dictionary<string, string>>();
                    tablas.Add("ERROR", res);
                    return tablas;
                }

                
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

    }// end class
}
